﻿'''
题目描述
向一个空栈压入正整数，每当压入一个整数时，执行以下规则（设: 栈顶至栈底整数依次编号为 n1, n2, …, nx，其中n1 为最新压入
的整数)
如果 n1 = n2，则 n1、n2全部出栈，压入新数据 m (m = 2*n1)
如果 n1 = n2 + … + ny( y的范围为[3,x]) ，则 n1, n2, …, ny 全部出栈，压入新数据 m (m = 2*n1)。
如果上述规则都不满足，则不做操作。
如：依次向栈压入 6、1、2、3，
当压入 2 时，栈顶至栈底依次为 [2,1,6]；
当压入 3 时，3 = 2 + 1，3、2、1 全部出栈，重新入栈整数6，此时栈顶至栈底依次为 [6,6]；6 = 6，两个 6 全部出栈，压入12，
最终栈中只剩个元素 12。 向栈中输入一串数字，请输出应用此规则后栈中最终存留的数字。
输入
使用单个空格隔开的正整数的字符串，如 “5 6 7 8”，左边的数字先入栈。
正整数大小为 [1, 2^31−1]。
正整数个数为 [1,1000]。
输出
最终栈中存留的元素值，元素值使用单个空格隔开，如 "8 7 6 5"，从左至右依次为栈顶至栈底的数字。
示例1
输入
10 20 50 80 1 1
输出
2 160
说明
解释: 向栈压入 80 时，10+20+50=80，数据合并后入栈 160，压入两个 1 时，合并为 2，最终栈顶至栈底的数字为 2 和 160。
示例2
输入
5 10 20 50 85 1
输出
1 170
'''
#输入
#使用单个空格隔开的正整数的字符串，如 “5 6 7 8”，左边的数字先入栈。

#正整数大小为 [1, 2^31−1]。
#正整数个数为 [1,1000]。
#输出
#最终栈中存留的元素值，元素值使用单个空格隔开，如 "8 7 6 5"，从左至右依次为栈顶至栈底的数字。

#读取输入
num_arr = list(map(int,input().split()))
#定义一个列表模拟栈
stack_list = []
#遍历输入列表，模拟压栈
for current_num in num_arr:
    part_sum = current_num
    
    #遍历栈，按条件压栈
    index = len(stack_list) - 1
    while index >= 0:
        part_sum -=  stack_list[index]
        if part_sum == 0:
            #等于对应元素的和，更新栈即弹栈
            stack_list = stack_list[:index]
            current_num *=  2
            part_sum = current_num
        elif part_sum < 0:
            break
        index -= 1
    #更新的current_num入栈,因为最终current_num肯定要入栈：不管是部分和小于0即小于某个栈中元素还是遍历到栈底
    stack_list.append(current_num)

#倒序输出栈中元素
print(' '.join(map(str,reversed(stack_list))))  #注意：逆序的使用